package com.gjzhao.fmmall.service.impl;

import static com.gjzhao.fmmall.vo.RespCode.FAILED;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.gjzhao.fmmall.dao.IndexImgMapper;
import com.gjzhao.fmmall.entity.IndexImg;
import com.gjzhao.fmmall.service.IndexImgService;
import com.gjzhao.fmmall.vo.RespCode;
import com.gjzhao.fmmall.vo.RespResultVO;
import com.gjzhao.fmmall.vo.ResponseResultVO;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

/**
 * @Description: 首页 ServiceImpl
 * @Author: gjzhao
 * @Date Created in 2022-01-01 9:57 下午
 */
@Service
public class IndexImgServiceImpl implements IndexImgService {

    private Logger logger = LoggerFactory.getLogger(IndexImgServiceImpl.class);

    @Autowired
    private IndexImgMapper indexImgMapper;
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 查询轮播图列表
     *
     * @return
     */
    @Override
    public ResponseResultVO listIndexImg() {

        List<IndexImg> indexImgList = indexImgMapper.getIndexImgList();

        if (CollectionUtil.isEmpty(indexImgList)) {
            return new ResponseResultVO(FAILED.getCode(), "查询数据为空或者失败", null);
        } else {
            return new ResponseResultVO(RespCode.SUCCESS.getCode(), "success", indexImgList);
        }
    }

    /**
     * 获取轮播图列表(使用java8中的Stream)
     *
     * @return
     */
    @Override
    public RespResultVO listIndexImgByByStream() {

        // 查询所有列表信息
        List<IndexImg> indexImgs = indexImgMapper.selectAll();

        //使用Stream进行操作
        List<IndexImg> filterList = indexImgs.stream()//串行流
                                             .filter(indexImg -> StrUtil.equals(indexImg.getStatus().toString(),"1")) //过滤
                                             .sorted((i1, i2) -> {
                                                 return i1.getSeq().compareTo(i2.getSeq());
                                             }) //排序
                                             .collect(Collectors.toList());

        if (CollectionUtil.isEmpty(filterList)) {
            return new RespResultVO(FAILED.getCode(), "查询数据为空或者失败", null);
        } else {
            return new RespResultVO(RespCode.SUCCESS.getCode(), "success", filterList);
        }

    }

    /**
     * 获取首页轮播图列表(redis方式)
     *
     * @return
     */
    @Override
    public RespResultVO listIndexImgByRedis() {

        try {
            //1.先从数据库查询轮播图信息: key -> String
            String indexImg = stringRedisTemplate.opsForValue().get("indexImgs");

            if (StrUtil.isNotBlank(indexImg)) {
                // 1.1 如果能够从redis查询到轮播图数据
                // [{},{},...] -> List<IndexImg>
                JSONArray jsonArray = JSONUtil.parseArray(indexImg);
                List<IndexImg> indexImgs = JSONUtil.toList(jsonArray, IndexImg.class);

                logger.info("-----轮播图信息在redis中存在:{},直接从redis中获取----", indexImgs);

                return RespResultVO.success(indexImgs);
            } else {
                logger.info("-----轮播图信息在redis中不存在，先从数据库中进行获取----");

                // 1.2 如果不能从redis查询到数据，则去数据库从进行查询
                List<IndexImg> indexImgList = indexImgMapper.getIndexImgList();

                if (CollectionUtil.isNotEmpty(indexImgList)) {
                    // 1.2.1 数据库中存在轮播图信息: 缓存到redis中，同时设置过期时间为1day
                    String indexImgsStr = JSONUtil.toJsonStr(indexImgList);
                    stringRedisTemplate.boundValueOps("indexImgs").set(indexImgsStr, 1, TimeUnit.DAYS);

                    logger.info("-----从数据库中获取到轮播图信息:{}，同时已缓存到redis，过期时间为:1天----", indexImgsStr);

                    return RespResultVO.success(indexImgList);
                } else {
                    // 1.2.2 数据库中不存在轮播图信息
                    logger.info("-----数据库中不存在轮播图信息----");
                    return RespResultVO.failed(RespCode.FAILED, "轮播图信息不存在");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            logger.info("-----当前操作发生异常:{}", e.getMessage());
            return RespResultVO.failed(RespCode.FAILED, e.getMessage());
        }
    }
}
